package kgame5.pbe.atlantic.manager {
	import kgame5.k3d.core.math.Vector3D;
	import kgame5.k3d.core.obj3d.spacial.SpacialVO;
	import kgame5.kutil.T;
	import kgame5.pbe.engine.core.ITickedObject;

	import flash.utils.Dictionary;
	import flash.utils.getTimer;

	/*
	 * 坦克要移动的,在XOZ平面上移动，有自动绕行
	 * 网格碰撞，这个支持把地图分成大个的网格，每个网格里可以放任意多的任意大小的障碍物。
	 * 高级点的游戏要这么用
	 * 一个hardVO如果是4个方向，则检测与其他的东西的碰撞
	 * 注意这个是个很重要的可用的东西啊
	 * !注意这个不支持斜向。斜向不好做
	 * 保存障碍物，处理碰撞之类
	 * Init();
	 * AddBar();
	 * RemoveBar();
	 * ProcessMove4();
	 * !!注意，速度是秒速
	 */
	public class SpacialManagerFly implements ITickedObject {
		
		//可移动的
		private var dict : Dictionary ;

		//可碰撞的列表，都是spaicalVO.type=ANIMAL
		///-private var arr_collider : Vector.<SpacialVO>;//可碰撞的,执行碰撞
		
		//地图边界
		//private var bound : BoxBound2D = new BoxBound2D();
		
		//阻力系数，f阻力=u阻力系数*v速度,
		//!!注意，暂时关闭了阻力系数
		public static var resistanceFactor:Number=0;//0.13;//[0~1]
		
//		//初始化，指定地图边界.barList是hardVO的list
//		public function init(w:int,h:int) : void {
//
//			dict= new Dictionary();
//
//			arr_collider= new Vector.<SpacialVO>();
//			
//			//TODO 设置边界
//		}
		
		public function start():void{
			dict= new Dictionary();

			//arr_collider= new Vector.<SpacialVO>();
		}
		public function clear():void{
			dict= null;

			//arr_collider= null;
		}

		
		public function addSpacialVO(vo : SpacialVO) : void {
			//T.p("SPCM.add",vo.id,vo);
			dict[vo.id] = vo;
			//arr_collider.push(vo);		
		}

		public function removeSpacialVO(vo : SpacialVO) : void {
			delete dict[vo.id];
//			var idx:int=arr_collider.indexOf(vo);
//			if(idx!=-1){
//				arr_collider.splice(idx, 1);
//			}
		}
		
		//注意这里传入的nouse时间不准确
		//注意这里使用的是秒速
		
		public function onTick(ms : Number) : void {
			
			
			
			//T.p("SPM.onTick",sec);
			
			this.move(ms);
			///-this.updateColliderList();//关闭了碰撞列表
			
			
			
		}

		//让可以动的东西移动,速度加上加速度，位置加上速度
		private function move(ms:Number) : void {
			//T.p("SPCM.move");
			var sec:Number=ms*0.001;
			for each(var vo:SpacialVO in dict) {
				//T.p(vo);
				if(vo.running==false){//处理点了暂停的情况
					continue;
				}
				switch(vo.movingMode){
					case SpacialVO.MOVING_MODE_FRAME_SPEED_WITH_ACC:
						
						this.moveByFrameSpeedWithAcc(vo,sec);
						break;
					case SpacialVO.MOVING_MODE_SEC_SPEED_NO_ACC:
						this.moveBySecSpeedNoAcc(vo,sec);
						break;
					case SpacialVO.MOVING_MODE_NONE:
						break;
				}
			}
		}
		
		//为了兼容cheezWorld老引擎而作
		//使用秒速，无加速度,设置时间间隔是30毫秒，但是是每帧触发
		private function moveBySecSpeedNoAcc(vo:SpacialVO,deltaTimeSec:Number):void{
			//计算速度
			vo.temp_velo.copy(vo.velo);
			vo.temp_velo.mul(deltaTimeSec);
			
			//1，先尝试加到指定位置
			vo.posi.add(vo.temp_velo);
		}
		
		private function moveByFrameSpeedWithAcc(vo:SpacialVO,deltaTimeSec:Number):void{
			vo.velo.add(vo.acc);
			vo.posi.add(vo.velo);
		}

//		//填充各个元素的碰撞列表
//		private function updateColliderList() : void {
//		//T.p("---------------检测全体碰撞-----------");
//		
//			//先清除各个碰撞
//			for each(var c:SpacialVO in arr_collider) {
//				c.collidedList = new Vector.<SpacialVO>();
//			}
//		
//			var len : int = arr_collider.length;
//		
//			for(var i : int = 0;i < len - 1;i++) {
//				var src : SpacialVO = arr_collider[i] as SpacialVO;
//				for(var j : int = i + 1;j < len;j++) {
//					var aim : SpacialVO = arr_collider[j] as SpacialVO;
//				
//					if(src.HitTestAABB(aim)) {
//						src.collidedList.push(aim);
//						aim.collidedList.push(src);
//					}
//				}
//			}
//		}
	}//end of class
}
